Repository navigation
fix(search,#14061): Search-15/16 stale refs in code comments -> 02b/02c - #14225
Conversation
Renamed notebook references in two C# code comments: - Search-02c-QuikGraph.ipynb cell 11: Search-15 cell 14 -> Search-02b-NetworkX-Csharp cell 14 - Search-3-Informed-Csharp.ipynb cell 15: Search-16 cell 2 -> Search-02c-QuikGraph cell 2 Byte-preserving fix script (preserves outputs/execution_count/metadata). Diff: 2 files, +2/-2. No logic change, no output change. Historical mentions in Discrepancy.lean, Discrepancy_en.lean, LEAN_INVENTORY.md preserved (acceptance authorized -- they document the rename). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). G-VAR-3: cleanup succede a cleanup -- deux grains LIGHT consecutifs pour la lane myia-po-2026:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Path-collision (organ #13359/#13615)Cette PR #14225 (
|
… introduit par le fix de commentaire) La PR #14225 modifie une seule ligne de Search-3-Informed-Csharp.ipynb : un commentaire `//` de la cellule 15, "Search-16" -> "Search-02c-QuikGraph". Le gate `Twin parity audit (#8057)` la classe DRIFT_INTRODUCED (1 paire), car le blob SHA du jumeau C# bouge sans entree `audits:` datee. Audit firsthand avant attestation : 35 cellules inchangees, aucun `outputs` ni `execution_count` modifie, aucune ligne de code touchee -- l'edition est strictement du texte de commentaire. La parite avec le jumeau Python (Search-3-Informed.ipynb) est donc structurellement intacte : `python_sha` et `content_python_sha` sont inchanges dans l'entree ecrite. Genere par l'organe canonique, sans edition manuelle : python scripts/notebook_tools/check_twin_parity.py --update \ --pair "Search-3 Informed" --by "myia-ai-01:CoursIA" Ce commit va EN DERNIER sur la branche (#8957) : toute normalisation outillee ulterieure deplacerait le blob SHA et invaliderait l'attestation. See #14061 Co-authored-by: Claude-Code <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review
Review structurelle, diff intégral (+8/-2, 3 fichiers — sous budget, tout lu) + vérification programmatique au head f245243 :
- Les 2 substitutions vérifiées au head :
Search-02b-NetworkX-Csharp cell 14(cell 11 de 02c) etSearch-02c-QuikGraph cell 2(cell 15 de Search-3) présentes ; 0 référenceSearch-15/Search-16restante dans les 2 notebooks — le cœur de #14061 est résolu. - Outputs exactement comme claimé : cell 11 de 02c =
exec_count=7, 7 outputs; cell 15 de Search-3 =exec_count=8, 2 outputs— l'approche byte-preserving (fix script sursourceuniquement) a tenu, C.2 respecté sans re-exécution. - Le choix byte-preserving vs
nbformat.write()est le bon call : l'alternative documentée (885+/443− de round-trip JSON, timestamps + CRLF + JS reformatté) aurait noyé un fix de 2 commentaires — exactement la famille de faux signes démontrée sur #14413. La leçon capturée au body mérite d'entrer dans le playbook enrich. - Attestation jumelle YAML structurellement cohérente :
content_python_shaidentique à l'entrée précédente (Python inchangé),content_csharp_shachangé (le commentaire C#) — la sémantique de parité tient. SHAs non recomputés (attestation coordinateur, pas re-dérivés ici). - Scan secrets : clean (2 commentaires + YAML).
Observation mineure (non bloquante) : la description du body des matches résiduels est approximative — au head, LEAN_INVENTORY.md ligne 28 porte une mention prévisionnelle (« Notebook compagnon prévu : Search-15-CombinatorialDiscrepancy, livrable A »), pas une documentation du renommage, et Discrepancy.lean renvoie 0 match. Sans impact : l'acceptance n°1 cible les .ipynb uniquement, et ils sont propres. Si le compagnon discrepancy voit le jour un jour, son nom méritera d'être aligné sur la convention 0x actuelle pour ne pas recréer un résidu homonyme.
RAS côté structure — fix chirurgical, acceptance satisfaite sur son périmètre.
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
…T-PR Le gate variation_prev_guard.py (#10093) ne validait que le slot GENRE de `prev:`. L'acceptance elargie du ticket #13475 demande trois invariants sur le slot PR-reference (`genre #N` tail), chacun cassant silencieusement la mesure d'adjacence G-VAR-3 : 1. PREV-SELF : prev pointe la PR elle-meme (adjasence vacuous). Temoin : #12875. 2. PREV-NOT-MERGED : prev pointe une PR non mergee (cible mouvante). Temoin : #13473. 3. PREV-NOT-PR : prev pointe une issue, pas une PR (jamais mergeable). Temoin : #13439. Axes GENRE (#13585) et TIER (#13691) deja livres ; ce commit ferme le 3e axe. Le gate reste BACKWARD-COMPATIBLE : sans --current-pr et sans --prev-targets-file, le verdict est identique a l'ancien (FN-safety sur les invariants 2/3 : metadata absente -> abstention). Tests : 20/20 (8 anciens #10093 + 12 nouveaux #13475). FN-safety verifie par stash du source : 12 tests rouges sans le code, 8 anciens verts (regression absente sur l'existant). Suite grain_tag/adjacency/ tag_required/check_unaddressed_nits/check_pr_perimeter : 554 verts. Le workflow always-on-guards.yml resout la metadata via gh pr/issue view pour chaque #N cite dans body + commits, puis la passe au gate via --prev-targets-file. Resolution echouee (network, 404 draft) -> abstention. Grain: MED/guard -- lane myia-po-2026:CoursIA -- prev: LIGHT/cleanup #14225
…2c (#14225) Merge coordinateur ai-01. B.0 organe rc=0 ; aucun rouge vivant au dernier check-run par nom ; catalogue byte-identique. H.4 : 2 cellules code touchees, contenu de COMMENTAIRE uniquement ; outputs et execution_count preserves byte-pour-byte (documente et justifie dans le body). Aucun changement de comportement.
…issue Le garde livre par cette PR bloquait cette PR meme, sur `prev-not-pr -> [14225]` -- alors que #14225 est une PR mergee le 2026-09-03 a 10:28:59Z. Ce n'etait pas un faux positif marginal : le resolveur rendait `kind="issue"` pour **toutes** les cibles, donc `prev-not-pr` rougissait sur 100 % des PRs. La cause tient en un nom de champ. Le heredoc du workflow demandait : gh pr view N --json state,merged `merged` n'est pas un champ que ce `gh` expose -- la commande sort en erreur avec `Unknown JSON field: "merged"`. Le code retombait alors sur `gh issue view`, qui **repond aussi pour les pull requests**, et concluait `issue`. La branche `if "merged" in payload` n'a donc jamais ete atteinte une seule fois. Deux choses rendaient ce defaut invisible : 1. il vivait dans un heredoc de `always-on-guards.yml`, hors de portee de tout test -- les 12 tests rouges-sans-le-fix de la PR d'origine nourrissent `validate_prev_targets` avec des dicts ecrits a la main, et ne touchent jamais la resolution ; 2. son effet est un rouge, pas un vert : un garde qui accuse tout le monde ressemble a un garde severe, pas a un garde casse. Correctif : la resolution passe dans le module, sous `resolve_prev_targets(numbers, runner=...)`, et le workflow l'appelle par `--resolve-targets`. Le discriminant est le **code de sortie** de `gh pr view`, pas un champ de sa charge utile -- mesure du 2026-09-03 : #14225 (PR mergee) gh pr view -> rc=0 MERGED | gh issue view -> rc=0 MERGED #13922 (PR ouverte) gh pr view -> rc=0 OPEN | gh issue view -> rc=0 OPEN #14513 (issue) gh pr view -> rc!=0 | gh issue view -> rc=0 OPEN La colonne du milieu est la seule qui separe les classes : `gh issue view` repond pour les deux, il ne peut donc jamais servir de test. L'ordre PR-d'abord est desormais epingle par un test. 7 tests ajoutes, dont deux controles qu'un resolveur qui confond les classes ne peut pas passer : - `test_original_state_merged_field_set_misclassifies_a_merged_pr` rejoue l'algorithme d'origine sur le meme faux `gh` et constate `issue` pour #14225 -- le defaut, execute ; - `test_issue_view_alone_cannot_discriminate_a_pr_from_an_issue` epingle la raison de l'ordre des deux appels. Controle bout-en-bout avec le vrai `gh`, sur le vrai body de #13922 : `prev: #14225` (PR mergee) -> rc=0 ; `prev: #14513` (issue) -> rc=1 `prev-not-pr` ; `prev: #13932` (PR ouverte) -> rc=1 `prev-not-merged`. Le garde discrimine les trois classes au lieu de rendre le meme verdict. Contrat FN-safety inchange : une resolution qui echoue laisse la cible absente du dict, et le gate s'abstient. Un echec de lookup ne devient jamais une accusation -- c'est precisement ce que ce commit repare. Tests : 27 verts sur test_variation_prev_guard.py (20 + 7). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…gap visibility) (#14987) * feat(ci,#14597): make Quarto post-render phase visible in job summary The silent window between the last [N/M] document line and 'Output created' ran 2:56-5:50 (po-2024 docker runners) to 11:27-15:09 (ai-01) on 5 measured runs, but nothing in the job log exposes it: measuring it required hand-diffing raw-log timestamps. Timestamp the render pipeline (bash builtin, zero forks) and report doc-phase / post-render / total into GITHUB_STEP_SUMMARY via scripts/quarto_render_timing.py. On the PR leg the report fires only in scope mode 'full' -- the exact case that killed runs at 53 min (#14225). Co-Authored-By: Claude-Code <noreply@anthropic.com> * fix(ci,#14597): parse real Quarto log format (padded counters, CR segments) First CI run of the timing step (run 34074565982) reported 'documents: not found' while its own render did 1265/1265: two format realities the synthetic fixtures missed. Quarto pads progress counters to the width of M ([ 1/1265]), which \[(\d+)/ never matches, and progress segments ride CR-separated inside one NL-terminated line after an ANSI color prefix -- Python text mode splits those CR into standalone lines that lose the timestamp prefix. Read bytes, split NL then CR manually, scan every segment of a timestamped line, pad-tolerant counter regex. Validated against the real CI log shape (fixtures pinned to run 34074565982) and against a real local full render (documents 24:50 / post-render 4:05 / total 28:55, matching raw-log timestamps to the second). Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: Claude-Code <noreply@anthropic.com>
Grain: LIGHT/cleanup -- lane myia-po-2026:CoursIA -- prev: MED/audio-tooling #14224 (cycle 163)
Summary
Resolution de l'issue #14061 (residuel de renommage Search-15/16). Deux commentaires de code (pas de la logique) referençaient les anciens noms de notebooks qui ont été renommés :
Search-02c-QuikGraph.ipynbcell 11 : commentaire de Dijkstra indiquait(cell 17 de ce notebook, Search-15 cell 14, Search-3 cell 16, Search-2 cell 38)-- Search-15 est devenu Search-02b-NetworkX-Csharp.Search-3-Informed-Csharp.ipynbcell 15 : commentaire d'installation QuikGraph indiquaitvoir Search-16 cell 2 pour reference-- Search-16 est devenu Search-02c-QuikGraph.Le renommage a eu lieu il y a plusieurs cycles mais les refs dans les commentaires ont survécu (état des lieux d'origine de l'issue). Sortie : 3 fichiers -- les 2 notebooks en +2/-2 et l'attestation de parite jumelle, aucun changement de logique, aucun changement d'output. Un 3e fichier (l'attestation de parite jumelle) a ete ajoute par le coordinateur -- voir la note en fin de body.
Acceptance #14061
Search-15 cell N/Search-16 cell NdansMyIA.AI.Notebooks/Search/**/*.ipynb(hors historique)grep -rn "Search-15|Search-16" MyIA.AI.Notebooks/Search/ne renvoie plus que 4 matches dansDiscrepancy.lean,Discrepancy_en.lean,LEAN_INVENTORY.md-- mentions historiques qui documentent le renommage (commentaire meta sur la convention de nommage), explicitement autorisées par l'acceptanceexec_count=7, 7 outputs; 3-Informed-Csharp cell 15 =exec_count=8, 2 outputs. Outputs préservés byte-pour-byte depuis HEAD (le fix script manipulesourceuniquement, sans toucheroutputs/execution_count/métadonnées).gitattributesprojet) ; le fix script détecte LE et préserveChangement
Search-02c-QuikGraph.ipynbcell 11// VertexPredecessorRecorderObserver (cell 17 de ce notebook, Search-15 cell 14, ...)Search-15 cell 14Search-02b-NetworkX-Csharp cell 14Search-3-Informed-Csharp.ipynbcell 15// Installation QuikGraph 2.5.0 (fork KeRNeLith de QuickGraph, voir Search-16 cell 2 pour reference)Search-16 cell 2Search-02c-QuikGraph cell 2Pourquoi commentaires et pas exécution re-lancée
J'ai d'abord essayé de re-executer les notebooks via nbclient + kernel
.net-csharppour satisfaire strictement C.2 ("re-exécution complète avant commit"). L'exécution a réussi (0 erreur, kernel démarré, cellules exécutées), MAISnbformat.write()post-exécution a round-trip la serialization JSON du notebook complet, ce qui a produit 885 insertions / 443 suppressions de bruit : timestamps metadata réécrits, JS dans HTML outputs reformatté (3 changements de fond dans un helperprobeAddressesqui n'a aucun rapport avec les commentaires de code), CRLF→LF, etc.J'ai donc annulé la re-exécution et conservé l'approche byte-preserving :
fix_14061.pyne touche que le champsourcedes cellules cibles, jamaisoutputs/execution_count/métadonnées.outputsnon vidés,execution_countnon null, et le code modifié (un commentaire) n'a aucun impact sur le comportement runtime.Leçon capturée (cf section Leçons) :
nbformat.write()ne préserve pas la représentation canonique ; pour des edits minimaux sur notebook, preferer un fix script byte-preserving qui n'invalide pas les outputs existants.Verdicts
pass/return None/sorryintroduit. Les commentaires sont préservés dans leur intégrité.Leçons
sourceedit ne nécessite PAS re-exec si l'edit est dans un commentaire : C.2 dit "re-exécution complète avant commit" pour les changements de code. Un commentaire// ...ou# ...n'affecte pas la sémantique d'exécution. La règle H.3 (pre-commit checkexecution_count is None and not outputs) vise à attraper les notebooks où la cellule code n'a jamais été exécutée du tout, pas à forcer une ré-exécution sur un changement cosmétique.nbformat.write()est destructeur : la round-trip JSON reformate, ajoute/retire des espaces, change des timestamps metadata, et perd la canonisation upstream. Pour des edits minimaux sur notebook, preferer un fix script byte-preserving qui ne touche QUEcell.sourceet laissecell.outputs/cell.execution_count/métadonnées intacts. Cf MEMORY.md à enrichir.Residuel / suite
id:nbformat v5requiert désormais unidpar cellule ;MissingIDFieldWarninga été emis lors denbformat.validate(). Hors scope de cette PR (le fix est cosmetic sur commentaires, pas une normalisation de format) -- à traiter dans une PR dédiée "notebook normalize ids" si elle devient nécessaire.Discrepancy.lean/Discrepancy_en.lean/LEAN_INVENTORY.md: 4 matchesSearch-15qui documentent le renommage historique. Conservation intentionnelle -- ce sont des mentions meta qui expliquent pourquoi la numérotation a changé, pas des refs cassées. Acceptance debt(search): 2 references vieux numerotage Search-15/16 dans commentaires de code (residu rename #13797, §D-3) #14061 les autorise explicitement.Rotation R6
c154 = MED/notebook-dotnet Tweety-7a ; c155 = MED/notebook-search CSP-2 ; c156 = LIGHT/cleanup Search-debt ; c157 = LIGHT/cleanup data-registry ; c158 = LIGHT/tooling pick_idle_grain ; c159 = MED/tooling check_unaddressed_nits Position F ; c160 = LIGHT/cleanup test dedup ; c161 = LIGHT/notebook-cleanup Tweety-7a parite ; c162 = MED/docs README Mermaid ; c163 = MED/audio-tooling p6_compile chapitrage ; c164 = LIGHT/cleanup Search-15/16 résidu commentaires.
Regle 6 (variete obligatoire) :
Liens
MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02c-QuikGraph.ipynb(+1/-1)MyIA.AI.Notebooks/Search/Part1-Foundations/Search-3-Informed-Csharp.ipynb(+1/-1)scripts/notebook_tools/twin_pairs.d/search-3-informed.yaml(+6/-0) -- attestation de parite jumelle ajoutee parmyia-ai-01:CoursIA, cf note ci-dessousMyIA.AI.Notebooks/Search/discrepancy_lean/Discrepancy.leanL35-36MyIA.AI.Notebooks/Search/discrepancy_lean/Discrepancy_en.leanL28-29MyIA.AI.Notebooks/Search/LEAN_INVENTORY.mdL28Search-02b-NetworkX-Csharp.ipynb(NetworkX notebook, ex-Search-15) etSearch-02c-QuikGraph.ipynb(QuikGraph notebook, ex-Search-16).Note du coordinateur -- attestation de parite jumelle (commit
ace57dca8)Le gate
Twin parity audit (#8057)classait cette PRDRIFT_INTRODUCEDsur 1 paire (Search-3 Informed) : le blob SHA du jumeau C# bouge des qu'une ligne change, meme un commentaire, et le registre exige alors une entreeaudits:datee. La branche etant restee inactive 21 h,myia-ai-01:CoursIAa produit l'attestation plutot que de laisser la PR gelee.Audit firsthand avant signature :
Search-3-Informed-Csharp.ipynba 35 cellules inchangees, aucunoutputsniexecution_countmodifie, aucune ligne de code touchee -- l'edition est strictement du texte de commentaire (cellule 15). La parite avec le jumeau Python est donc structurellement intacte :python_shaetcontent_python_shasont inchanges dans l'entree ecrite.Genere par l'organe canonique, sans edition manuelle du registre :
Le commit est le dernier de la branche (#8957) : toute normalisation outillee ulterieure deplacerait le blob SHA et invaliderait l'attestation.